Skip to content

add fork-pr-workflow skill — factory-portable fork→upstream contribution flow#47

Merged
AceHack merged 1 commit intomainfrom
add-fork-pr-workflow-skill
Apr 21, 2026
Merged

add fork-pr-workflow skill — factory-portable fork→upstream contribution flow#47
AceHack merged 1 commit intomainfrom
add-fork-pr-workflow-skill

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 21, 2026

Summary

  • New capability skill at .claude/skills/fork-pr-workflow/SKILL.md covering three-remote setup (origin=fork, upstream=canonical), the feature-branch daily loop, per-PR upstream submission as the default rhythm, merge-queue + auto-merge compatibility with cross-repo PRs, pre-flight checklist, and common anti-patterns.
  • Factory-portable: no project: zeta frontmatter, no hardcoded Zeta paths or module names. Default rhythm is per-PR immediate upstream (industry norm for OSS contribution); projects that override that rhythm do so in a project-specific doc and cite it from there.
  • Complements git-workflow-expert (within-repo branch flow + sibling-clone convention for read-only OSS mirrors). Boundary is explicit in both skills' "What this skill does NOT do" sections.

Why

Maintainer signal thread 2026-04-21:

  1. "we only need to upstram back to lfg like every 10prs" — Zeta-specific override motivation (per-push Copilot-review cost on LFG; batch amortises).
  2. "this only upstram ever 10 prs is pretty unique to this project ... most people push upstream after one PR" — establishes per-PR as industry default.
  3. "so the generic factory should default to immidate and the zeta override is every 10" — final design requirement: skill default = per-PR; Zeta batching is project-specific override and lives outside the skill.

The first AceHack/Zeta → Lucent-Financial-Group transfer (2026-04-21) established LFG as the canonical repo. The fork contribution path is how both human and agent contributors will reach it — the skill gives them a factory-portable procedure for that path.

Test plan

  • actionlint-equivalent mental lint: frontmatter is valid YAML, body is markdown-clean.
  • Skill readable end-to-end; no dangling references to Zeta-specific paths.
  • "What this skill does NOT do" enumerates boundary with git-workflow-expert.
  • Batched-upstream overlay is a clearly-labelled optional section, not the primary flow.
  • CI on this PR green (markdownlint + actionlint + shellcheck + semgrep + no-empty-dirs + ubuntu-22.04 build).

🤖 Generated with Claude Code

…ion flow

New capability skill (hat) covering the fork-based PR contribution
flow: three-remote setup (origin=fork, upstream=canonical), feature-
branch daily loop, per-PR upstream submission as the default rhythm,
merge-queue + auto-merge compatibility with cross-repo PRs, common
anti-patterns, and a clearly-labelled optional overlay for projects
that batch upstream PRs on a non-default cadence.

Factory-portable by design: no `project: zeta` frontmatter, no
hardcoded Zeta paths or module names. The skill's default is
per-PR immediate upstream (industry norm for OSS contribution);
any project that overrides that rhythm (for example, batching
every N fork PRs to amortise per-push upstream review cost)
declares the override in a project-specific doc and cites it
from there — the skill itself stays factory-portable.

Complements `git-workflow-expert` (within-repo branch flow +
sibling-clone convention for read-only OSS mirrors). Boundary
is explicit in both skills' "What this skill does NOT do"
sections: this one covers cross-repo fork PRs, the other
covers within-repo branch PRs.

Rationale:
- Maintainer 2026-04-21: "we only need to upstram back to lfg
  like every 10prs" (Zeta-specific override motivation)
- Maintainer 2026-04-21: "this only upstram ever 10 prs is
  pretty unique to this project ... most people push upstream
  after one PR" (establishes per-PR as industry default)
- Maintainer 2026-04-21: "so the generic factory should
  default to immidate and the zeta override is every 10"
  (final design requirement: skill default = per-PR;
  Zeta override isolated to project-specific doc)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 21, 2026 14:51
@AceHack AceHack enabled auto-merge (squash) April 21, 2026 14:51
@AceHack AceHack merged commit 4368222 into main Apr 21, 2026
13 checks passed
@AceHack AceHack deleted the add-fork-pr-workflow-skill branch April 21, 2026 14:52
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new factory-portable capability skill documenting the standard fork → upstream contribution workflow, including remote setup, daily feature-branch loop, merge-queue/auto-merge notes, and common anti-patterns.

Changes:

  • Introduces .claude/skills/fork-pr-workflow/SKILL.md describing a fork-based PR flow (origin=fork, upstream=canonical).
  • Documents an optional “batched upstream” overlay for cost-constrained projects.
  • Adds troubleshooting guidance for cross-repo PR behaviors (merge queue, auto-merge, bot reviewers).

Comment on lines +112 to +116
# Sync fork's main with upstream before starting new work.
git fetch upstream
git checkout main
git merge --ff-only upstream/main
git push origin main
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This skill is described as factory-portable, but the daily loop hardcodes the default branch name as main in multiple commands (checkout main, merge upstream/main, --base main). Repos still commonly use master or another default; consider using a <default-branch> placeholder consistently (as in the earlier gh pr create mention) or using upstream/HEAD after setting the remote head.

Copilot uses AI. Check for mistakes.
Comment on lines +219 to +220
a different working copy). That's the kind of
history-destruction event BP-24 warns against.
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The --force-with-lease guidance is good, but the reference to “BP-24” here appears incorrect: BP-24 in docs/AGENT-BEST-PRACTICES.md is a consent/emulation rule, not a git history safety rule. Please remove the BP-24 reference or replace it with an accurate pointer.

Suggested change
a different working copy). That's the kind of
history-destruction event BP-24 warns against.
a different working copy). That prevents the kind of
history-destruction event this workflow is avoiding.

Copilot uses AI. Check for mistakes.
Comment on lines +44 to +46
the GitHub "Compare & pull request" flow or
`gh pr create --repo <upstream> --base <default-branch>
--head <fork-owner>:<branch>`.
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The inline code span for the cross-repo gh pr create ... command is split across two lines (the opening backtick is on one line and the closing backtick is on the next). Most Markdown renderers (and markdownlint) do not support multi-line inline code spans, so this will render incorrectly and may fail lint. Use a fenced code block or keep the entire inline command on a single line.

Suggested change
the GitHub "Compare & pull request" flow or
`gh pr create --repo <upstream> --base <default-branch>
--head <fork-owner>:<branch>`.
the GitHub "Compare & pull request" flow or `gh pr create --repo <upstream> --base <default-branch> --head <fork-owner>:<branch>`.

Copilot uses AI. Check for mistakes.
Comment on lines +34 to +41
Three named remotes in your local clone:

- **`origin`** — your personal fork (read/write you own).
- **`upstream`** — the canonical repo (read-only for
non-maintainers; maintainers can push but usually
don't).
- No third remote unless you're syncing across multiple
forks (rare).
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section says “Three named remotes in your local clone” but then only defines origin and upstream (and explicitly says no third remote). This reads like a factual inconsistency; either change it to “Two named remotes” or define what the third remote is meant to be.

Copilot uses AI. Check for mistakes.
AceHack added a commit that referenced this pull request Apr 23, 2026
Four Copilot findings:

1. "Schema per row #44" misref — row #44 on main is "Supply-
   chain safe-patterns audit"; fire-history schema is defined
   in row #47 "Cadence-history tracking hygiene". Fixed in
   docs/hygiene-history/backlog-refactor-history.md.
2. & 4. AutoDream research doc + row #53 dangling in-tree —
   clarified with "lands via PR #155" per the recurring xref
   pattern.
3. Row #54 not in main + memory file missing — same
   lands-via-PR pattern (#166 for row #54; memory lives in
   per-user, already noted in the row content). No code
   change; thread will be resolved with reply.

Meta-finding: row #47 itself contains internal self-references
calling itself "row #44" (from a prior row-number era that
renumbered without updating self-refs). This is a pre-existing
inconsistency, not caused by this PR. Candidate for backlog-
refactor hygiene #54 sweep when it fires against
FACTORY-HYGIENE.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…ught

4 Copilot findings on PR #168: 2 xref (lands-via-#155); 1
row-number misreference ("Schema per row #44" was actually
#47 — row #44 is supply-chain; #47 is cadence-history); 1
combined reply-with-rationale.

Meta-finding (commit-body only, not this PR's scope): row
#47 itself has internal self-refs calling itself "row #44"
from a prior renumbering. Flagged as candidate for row #54
first-fire sweep.

Fixed docs/hygiene-history/backlog-refactor-history.md +
docs/BACKLOG.md; rebased; pushed. 4 threads resolved.

Observation: row-number misref is a new finding class I
hadn't seen. Copilot review caught it; target for row #54
sweeps.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…ow) (#168)

* hygiene: first backlog-refactor fire — knowledge-absorb update on AutoDream row

First firing of FACTORY-HYGIENE row #54 (backlog-refactor
cadenced audit), bounded to a single knowledge-absorb pass on
one row.

Target: the "Retraction-native memory-consolidation (better
dream mode) research project" row. Updated to cross-reference
the newer AutoDream extension-overlay policy (PR #155) + row
#53. The better-dream-mode project is reframed as the
more-ambitious second step conditional on the overlay policy
proving insufficient — not the primary AutoDream response
anymore.

Fire-history file landed at
docs/hygiene-history/backlog-refactor-history.md per row #44
obligation. First entry documents the bounded-pilot approach
(one row updated, no retires, pre/post row count approximately
unchanged).

Self-scheduled free work under the 2026-04-23 scheduling-
authority rule.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* hygiene: address PR #168 review findings

Four Copilot findings:

1. "Schema per row #44" misref — row #44 on main is "Supply-
   chain safe-patterns audit"; fire-history schema is defined
   in row #47 "Cadence-history tracking hygiene". Fixed in
   docs/hygiene-history/backlog-refactor-history.md.
2. & 4. AutoDream research doc + row #53 dangling in-tree —
   clarified with "lands via PR #155" per the recurring xref
   pattern.
3. Row #54 not in main + memory file missing — same
   lands-via-PR pattern (#166 for row #54; memory lives in
   per-user, already noted in the row content). No code
   change; thread will be resolved with reply.

Meta-finding: row #47 itself contains internal self-references
calling itself "row #44" (from a prior row-number era that
renumbered without updating self-refs). This is a pre-existing
inconsistency, not caused by this PR. Candidate for backlog-
refactor hygiene #54 sweep when it fires against
FACTORY-HYGIENE.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
Copilot caught two row-number inconsistencies:
- "Cross-platform parity (FACTORY-HYGIENE row #48)" was
  incorrect — row #48 is GitHub surface triage; cross-
  platform parity is row #51. Fixed.
- "fire-log surfaces per row #44" was incorrect — row #44
  is supply-chain safe-patterns; cadence-history / fire-
  history schema is row #47. Fixed + clarified.

Third finding (docs/research/multi-repo-refactor-shapes
path) — will be handled via reply-with-rationale (lands
via PR #150, still open).

Row-number misref is a recurring finding class across
session PRs; candidate sweep target for backlog-refactor
hygiene row #54 first cadenced fire.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…w-number fixes

PR #159 (Overlay A #3 deletions-over-insertions) MERGED at
18:02:47Z. 11 session PRs merged. HLL test passed on re-run
(different seed) — real-world data for the PR #175 BACKLOG
row on HLL flakiness; pin-then-explore is still the right
fix.

Aaron directive: "be PC when you write the 69 and 420
descriptions of whemsy we want this repo to be high school
curruclurm friendly so R rated is okay but only when
necessary for effect." PC-ified seed-whimsy memory
descriptions (69 → internet-meme-symmetrical-digit;
420 → counterculture-meme). Added PC-framing section
naming the high-school-curriculum-friendly standard.

PR #172 row-number misrefs fixed (#48#51 for cross-
platform parity; #44#47 for fire-history schema).
Third finding via lands-via-#150 reply.

Row-number misref is recurring; candidate for row #54
first cadenced fire.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…o-split) (#172)

* backlog: P2 — factory status UI on GitHub Pages (git-native, post-repo-split)

Aaron 2026-04-23: "static ui on our github pages that shows
factory status things in flight progress, etc ... we can
surface thing in the ui like the decions and any decions we
would like human feedback on ... all this should be able to
use our gitnative approach and not really cost anyting ...
backlog this and probaby not a good idea until after the
repo split into the different projects."

Row captures:
- Goal: static UI surfacing factory state (PRs, ADRs,
  HUMAN-BACKLOG asks, round progress)
- Constraint: git-native + ~free (static SSG regenerated by
  GitHub Action; no paid SaaS)
- Tech candidates deferred (Jekyll / Hugo / Astro / Eleventy
  / bun-based custom SSG — bun aligns with post-setup stack
  row #49)
- Sequencing: after multi-repo split (PR #150 prerequisite)
- Cross-refs to AGENT-GITHUB-SURFACES Pages row, HUMAN-
  BACKLOG, DECISIONS, ROUND-HISTORY, hygiene-history

P2 per Aaron's "probably not a good idea until after the
repo split" sequencing hint.

Self-scheduled free work (row-filing) under the 2026-04-23
scheduling-authority rule.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog: Pages-UI row — add read-only-first / write-later refinement

Aaron 2026-04-23: "ui will likely need gh, our repo is public
so for all the read actions on the ui we are good without
permission, for write actions we probably don't need this yet
would need whole permission set and resue of the github logins
session stuff without a real backend, tricky stuff so readonly
to expaned to write access later. backlog just a little
refinement."

Row updated with:
- Phase 1 read-only: GitHub REST API against public repo, no
  auth (rate-limit applies; acceptable per-push-refresh
  dashboard)
- Phase 2 write: needs GitHub session/OAuth or thin backend;
  both break git-native + ~free-to-run; deferred until
  tradeoff re-examined

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog: Pages-UI row — bun+TS as tech choice; Jekyll excluded per maintainer

Aaron 2026-04-23 reminder: "i'm fine with either but last
time you push me hard away from jekyll that i think we only
need typescript bun based and no jekyll unless you tell me
otherwise."

Row updated:
- Tech choice is bun + TypeScript SSG (composes with
  FACTORY-HYGIENE row #49 post-setup stack default)
- Jekyll explicitly excluded
- Hugo / Astro / Eleventy demoted from listed candidates
- If a compelling reason to revisit Jekyll surfaces during
  research, it lands as an ADR with explicit rationale;
  default is bun+TS

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog: Pages-UI row — fix Jekyll-exclusion attribution (Kenji, not maintainer)

Aaron 2026-04-23: "technically Kenji told me to exclude this
not me, feel free to reevnualte but take the whole project
into consideration".

Row updated:
- Attribution corrected: Kenji (Architect persona) made the
  bun+TS-over-Jekyll recommendation, not the maintainer
  directly
- Re-evaluation with whole-project consideration documented:
  cross-platform parity (row #48), post-setup stack default
  (row #49), one-language-rule (no new Ruby chain), GitHub
  Pages + Actions build pattern works regardless of native-
  Pages SSG support, bun+SSG ecosystem rich enough
- Conclusion: Kenji's call stands after re-examination

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog: Pages-UI row — apply plural-host distinction (git-native content vs GitHub adapter)

Aaron 2026-04-23: "i guess pages is github native, but our
code can likely be git native only need git and not gh
commands but gh commands are welcome we just need to call
out gh becasue we want to be pluggable eventually to gitlab
to, we are gitnative with our first host as github."

Row constraint-section refined to distinguish:
- Git-native content (PRs / ADRs / HUMAN-BACKLOG /
  CONTRIBUTOR-CONFLICTS / ROUND-HISTORY / hygiene-history —
  lives in repo regardless of host)
- GitHub adapter (Pages + Actions + REST API are
  GitHub-specific; UI itself is explicitly labeled as the
  GitHub adapter against the git-native content spec)

When a second host activates (GitLab / Gitea / Bitbucket), a
sibling adapter ships against the same content spec. First
host is GitHub per "gitnative with our first host as
github".

Full plural-host discipline in per-user memory
feedback_git_native_vs_github_native_plural_host_pluggable_adapters_2026_04_23.md.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* backlog: Pages-UI row — fix row-number misrefs per PR #172 review

Copilot caught two row-number inconsistencies:
- "Cross-platform parity (FACTORY-HYGIENE row #48)" was
  incorrect — row #48 is GitHub surface triage; cross-
  platform parity is row #51. Fixed.
- "fire-log surfaces per row #44" was incorrect — row #44
  is supply-chain safe-patterns; cadence-history / fire-
  history schema is row #47. Fixed + clarified.

Third finding (docs/research/multi-repo-refactor-shapes
path) — will be handled via reply-with-rationale (lands
via PR #150, still open).

Row-number misref is a recurring finding class across
session PRs; candidate sweep target for backlog-refactor
hygiene row #54 first cadenced fire.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
… row #55) (#198)

Per Aaron 2026-04-23 Otto-27: "we can have a machine
specific scrubber/lint hygene task for anyting that makes
it in by default" + "just run on a cadence."

Files added:
- tools/hygiene/audit-machine-specific-content.sh —
  scans tracked files for machine-specific patterns
  (/Users/<name>/, /home/<name>/, C:\Users\<name>,
  C:/Users/<name>). Detect-only; --list + --enforce modes.
- docs/FACTORY-HYGIENE.md row #55 — full schema per
  existing hygiene-row pattern; Dejan (devops-engineer)
  on cadenced fire; classified prevention-bearing
  (row #47 taxonomy).

Baseline at first fire: 9 gaps across .claude/skills/,
docs/ PDFs, and one legitimate anti-example reference
in memory/feedback_path_hygiene.md. All pre-existing;
this row surfaces them for opportunistic cleanup.

Exclusions (historical content preserved verbatim per
append-only discipline):
- docs/ROUND-HISTORY.md
- docs/hygiene-history/**
- docs/DECISIONS/**
- the audit script itself (patterns as examples)

Composes with Otto-27 Option D in-repo-first policy
(PR #197 migrating CURRENT-*.md files) — the scrubber
prevents machine-specific leakage as new content enters
the in-repo boundary by default.

Attribution: Otto (loop-agent PM hat) scripted the audit;
Dejan (devops-engineer) owns cadenced operation.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…ORY-HYGIENE row #56)

Prevents recurring regression hit 3× in session.

Tool: tools/hygiene/audit-md032-plus-linestart.sh.
Baseline: 3 pre-existing gaps in persona notebooks.
Detect-only; --list + --enforce modes.

FACTORY-HYGIENE row #56 with full schema. Classified
prevention-bearing per row #47 taxonomy.

Pivot discipline: attempted linguistic-seed term #2
equality but #202 truth still BLOCKED/OPEN (directory
not on main yet). Pivoted to row #56 work instead of
stacking dependent substrate.

Third tool-hardening landing in session (after #198
scrubber + #199 batch-resolve). Tool-substrate
developing alongside content.

Attribution: Otto (loop-agent PM hat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 23, 2026
…action item #1) (#220)

Amara's 2026-04-23 decision-proxy + technical review courier (PR #219)
ranked memory-index-integrity CI as her highest-value immediate fix:
directly prevents the NSA-001 measured failure mode (new memory landed
without MEMORY.md pointer → undiscoverable from fresh session).

New workflow: `.github/workflows/memory-index-integrity.yml`

Check: if a PR (or push to main) adds or modifies any top-level
`memory/*.md` file, `memory/MEMORY.md` MUST also be in the same
range. Fails with an explicit remediation message citing NSA-001.

Scope excludes:
  - memory/persona/**  (per-persona notebooks have their own lifecycle)
  - memory/README.md   (convention doc)
  - memory/MEMORY.md   (the index itself)
  - Deletions          (covered from the other direction by FACTORY-
                        HYGIENE row #25 pointer-integrity audit)

Safe-pattern compliant per FACTORY-HYGIENE row #43:
  - actions/checkout@de0fac2... SHA-pinned
  - Explicit minimum `permissions: contents: read`
  - Only first-party trusted context (github.sha, github.event.pull_
    request.base.sha, github.event.before) passed via env:
  - No user-authored context referenced anywhere
  - concurrency group + cancel-in-progress: false
  - runs-on: ubuntu-22.04 pinned
  - actionlint clean; shellcheck clean (SC2086 fixed)

FACTORY-HYGIENE row #58 added documenting the cadence / owner /
scope / durable output + classification (row #47: prevention-
bearing — blocks merge before substrate diverges from index).

Row numbered 58 to leave #56 reserved for in-flight PR #204 (MD032
preflight) and #57 for in-flight PR #213 (git-hotspots audit).

Ships to project-under-construction: adopters inherit the workflow
unchanged; the memory/**.md + memory/MEMORY.md conventions are
factory-generic.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…ax, seeded hygiene-history, IP template cleanup

- UPSTREAM-RHYTHM.md: fix compare basehead syntax (Codex P1 — use owner:branch, not owner:repo:branch)
- AGENT-GITHUB-SURFACES.md + github-surface-triage SKILL.md: FACTORY-HYGIENE row refs #44#47, #45#48
- AGENT-ISSUE-WORKFLOW.md: soften "BACKLOG row is open" to "TODO: file a BACKLOG row"
- research/lfg-only-capabilities-scout.md: clarify HB-001 is resolved org-migration; merge queue is follow-up
- BACKLOG.md: unsplit inline-code spans in P3 LFG row
- hygiene-history/{wiki,discussions}-history.md: seed files referenced by Surface 3/4 docs
- .github/ISSUE_TEMPLATE/feature_request.md: remove stale GitHub default template (Zeta set covers bug_report/backlog_item/human_ask)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
* docs: add UPSTREAM-RHYTHM.md — Zeta's fork-first batched PR cadence (#2)

The fork-pr-workflow skill defers the upstream-cadence choice to
project-level config. This is Zeta's config:

- Default PR target: AceHack/Zeta:main (free CI, free Copilot)
- Bulk sync AceHack/main -> LFG/main every ~10 PRs (one PR, not N)
- Five named exceptions for direct-to-LFG (security P0, external
  contributor, Aaron explicit, CI-repair, the bulk-sync PR itself)
- Concrete gh commands for each case
- Proposed cadence-monitor FACTORY-HYGIENE row

Resolves a phantom pointer in
memory/feedback_fork_pr_cost_model_prs_land_on_acehack_sync_to_lfg_in_bulk.md
which cited docs/UPSTREAM-RHYTHM.md as an intended target.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* docs: scout LFG-only capabilities; add 6th direct-to-LFG exception; P3 BACKLOG row

Aaron 2026-04-22 clarified LFG is not just "paid surface to avoid"
but a throttled experimental tier: Copilot Business + Teams plan,
all enhancements enabled (internet search, coding agent, etc.).
Standing permission to change any LFG setting except the $0 budget
cap and personal info. Enterprise upgrade offered if we build a
large-enough LFG-only backlog to justify it.

Changes:

- docs/research/lfg-only-capabilities-scout.md — new scouting doc.
  Verified Copilot Business plan via gh api; enumerates 10
  candidate experiments across Copilot Business, Teams plan,
  Actions runner classes, and org-level features. Each has a
  cadence. Declines self-hosted runners and raising the budget cap.

- docs/UPSTREAM-RHYTHM.md — adds a 6th direct-to-LFG exception
  ("LFG-only capability experiment") so these experiments don't
  fight the batched cost model.

- docs/BACKLOG.md — new P3 row "LFG-only experiment track
  (throttled)" pointing at the scout doc; gated on the 10-item
  threshold for the Enterprise upgrade conversation.

Source memory:
memory/feedback_lfg_paid_copilot_teams_throttled_experiments_allowed.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* docs: address PR #139 review threads — row-number fixes, compare syntax, seeded hygiene-history, IP template cleanup

- UPSTREAM-RHYTHM.md: fix compare basehead syntax (Codex P1 — use owner:branch, not owner:repo:branch)
- AGENT-GITHUB-SURFACES.md + github-surface-triage SKILL.md: FACTORY-HYGIENE row refs #44#47, #45#48
- AGENT-ISSUE-WORKFLOW.md: soften "BACKLOG row is open" to "TODO: file a BACKLOG row"
- research/lfg-only-capabilities-scout.md: clarify HB-001 is resolved org-migration; merge queue is follow-up
- BACKLOG.md: unsplit inline-code spans in P3 LFG row
- hygiene-history/{wiki,discussions}-history.md: seed files referenced by Surface 3/4 docs
- .github/ISSUE_TEMPLATE/feature_request.md: remove stale GitHub default template (Zeta set covers bug_report/backlog_item/human_ask)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…56)

Addresses recurring MD032 regression hit 3 times in
Otto-session (Otto-35 + Otto-38 + Otto-38 again).
Pattern: author writes prose continuation like
  Full treatment in the DBSP paper
  + docs/ARCHITECTURE.md §operator-algebra.
and markdownlint parses the '+ ' as a list item,
firing MD032 (list not surrounded by blank lines).

Tool: tools/hygiene/audit-md032-plus-linestart.sh —
scans tracked .md files for '^+ ' with non-blank
previous line. Skips files using '+ ' consistently
as bullet style (3+ occurrences). --list / --enforce
modes per row #55 pattern.

Baseline at first fire: 3 pre-existing gaps in
persona notebooks (memory/persona/best-practices-
scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md).
Detect-only; enforce-transition deferred.

FACTORY-HYGIENE row #56 lands with full schema per
row #55 pattern. Classified prevention-bearing
(row #47 taxonomy).

Attribution: Otto (loop-agent PM hat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…56)

Addresses recurring MD032 regression hit 3 times in
Otto-session (Otto-35 + Otto-38 + Otto-38 again).
Pattern: author writes prose continuation like
  Full treatment in the DBSP paper
  + docs/ARCHITECTURE.md §operator-algebra.
and markdownlint parses the '+ ' as a list item,
firing MD032 (list not surrounded by blank lines).

Tool: tools/hygiene/audit-md032-plus-linestart.sh —
scans tracked .md files for '^+ ' with non-blank
previous line. Skips files using '+ ' consistently
as bullet style (3+ occurrences). --list / --enforce
modes per row #55 pattern.

Baseline at first fire: 3 pre-existing gaps in
persona notebooks (memory/persona/best-practices-
scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md).
Detect-only; enforce-transition deferred.

FACTORY-HYGIENE row #56 lands with full schema per
row #55 pattern. Classified prevention-bearing
(row #47 taxonomy).

Attribution: Otto (loop-agent PM hat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 24, 2026
…204)

* hygiene: MD032 '+'-at-line-start preflight audit (FACTORY-HYGIENE row #56)

Addresses recurring MD032 regression hit 3 times in
Otto-session (Otto-35 + Otto-38 + Otto-38 again).
Pattern: author writes prose continuation like
  Full treatment in the DBSP paper
  + docs/ARCHITECTURE.md §operator-algebra.
and markdownlint parses the '+ ' as a list item,
firing MD032 (list not surrounded by blank lines).

Tool: tools/hygiene/audit-md032-plus-linestart.sh —
scans tracked .md files for '^+ ' with non-blank
previous line. Skips files using '+ ' consistently
as bullet style (3+ occurrences). --list / --enforce
modes per row #55 pattern.

Baseline at first fire: 3 pre-existing gaps in
persona notebooks (memory/persona/best-practices-
scratch.md, ilyana/NOTEBOOK.md, kenji/OFFTIME.md).
Detect-only; enforce-transition deferred.

FACTORY-HYGIENE row #56 lands with full schema per
row #55 pattern. Classified prevention-bearing
(row #47 taxonomy).

Attribution: Otto (loop-agent PM hat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* hygiene: fix MD038 trailing-space-in-code-span on row #56

Replaced '`+ `' + '`^+ `' with '`+` followed by space' +
'`^+` (plus-at-line-start followed by space)' to remove
trailing spaces inside code spans.

Markdownlint MD038 rule forbids leading/trailing spaces in
code spans. The semantic meaning ('+' followed by space
character) is now in prose.

Attribution: Otto (loop-agent PM hat).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* hygiene: rewrite MD032 audit for CommonMark correctness + review-drain fixes (PR #204 threads)

Addresses 19 unresolved review threads on PR #204 clustered into six
distinct issues — consolidated into a single cohesive rewrite:

  * NUL-delimited `git ls-files -z | while read -d ''` iteration
    (whitespace-safe paths; matches sibling hygiene-script convention).
  * `cd "$(git rev-parse --show-toplevel)"` first so paths resolve
    from repo root regardless of $PWD.
  * Previous-line blank check strips all whitespace (spaces, tabs, CR)
    via `${var//[[:space:]]/}` — tab-only predecessors count as blank.
  * Contiguous `+ `-list detection: if the previous line is itself a
    `^ {0,3}\+ ` marker line, it's list continuation, not a gap.
  * CommonMark-compliant pattern `^ {0,3}\+ ` — up to 3 leading spaces
    allowed on `+ `-marker lines (indented `+` in header example now
    matched).
  * `plus_lines_count >= 3` file-level skip heuristic removed —
    per-line contiguous-list detection makes it unnecessary and was
    masking false negatives (file could mostly use `+` as list marker
    while still containing a stray prose-continuation `+`).
  * Post-setup stack header added to match sibling convention.
  * Portability: `while read`-based file load instead of `mapfile`
    (macOS bash 3.2 parity).

FACTORY-HYGIENE.md row #56 description updated to match the new
behaviour (pre-merge refinement of the new row, permitted under
append-only audit-trail discipline).

Build: 0W/0E.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* hygiene: markdownlint-fix MD038/MD056 on FACTORY-HYGIENE row #56

Line 102 in docs/FACTORY-HYGIENE.md triggered 11 MD038
(no-space-in-code) warnings and 1 MD056 (table-column-count)
warning. Rewrote the row text to:

- Replace code-span literals that started or ended with a
  space (`+ `, `^ {0,3}\+ `, `. Excludes: `, `, `, `; `, etc)
  with prose phrasings that keep the meaning without the
  MD038-tripping whitespace inside backticks.
- Split the `git ls-files -z | while read -d ''` code span
  into two separate spans so the `|` does not land inside a
  code-span in a table cell (markdownlint-cli2 was counting
  it as a ninth column against the 8-column header).

No semantic change to the hygiene rule itself; no changes to
tools/hygiene/audit-md032-plus-linestart.sh. Full repo
markdownlint-cli2@0.18.1 run is clean; dotnet build -c Release
is 0W/0E.

* hygiene: fix sibling-script citation in audit-md032 comment

Copilot caught that audit-memory-references.sh doesn't use
`git ls-files -z` iteration (it parses a single target file).
Replace with audit-post-setup-script-stack.sh which does use
the NUL-delimited pattern. No behaviour change; comment only.

Addresses PR #204 Copilot review thread on line 82.

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants